package messagerie;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

/**
 * Un Opérateur gère des abonnés et des communications
 */
public class Operateur{

	// Attributs propres à la classe Opérateur

	private String nom; 
	private List<Forfait> forfaits;
	public List<Operateur> operateurs;
	private List<NumeroTelephone> numsTel;
	private List<AbonneOperateur> listeAbonnes;
	private List<Appel> appelsEnCours;


	// Constructeur

	public Operateur (String nomOp){
		this.nom = nomOp;
		this.forfaits = new ArrayList<Forfait>();
		this.numsTel = new ArrayList<NumeroTelephone>();
		this.appelsEnCours= new ArrayList<Appel>();
		this.listeAbonnes = new ArrayList<AbonneOperateur>();


		/*for (int i = 0; i<10; i++){
			this.numsTel.add("+33(0)70000000" + i);
		}
		 */
	}


	/**
	 * Une personne souscrit un abonnement et reçoit un téléphone
	 * @param nomPersonne : nom de la personne voulant souscrire un nouvel abonnement
	 * @param nomForfait : nom du forfait que choisit le nouvel abonné
	 * @
	 */

	public Telephone souscrire(String nomPersonne, String nomForfait)
	{
		Forfait forfait = new Forfait(nomForfait);
		AbonneOperateur abo = new AbonneOperateur(nomPersonne, forfait, this);
		Telephone result = new Telephone (abo);
		abo.assignerTel(result);
		NumeroTelephone numAbo = new NumeroTelephone(abo,this);
		abo.assignerNum(numAbo);
		this.listeAbonnes.add(abo);
		return result;
	}

	/**
	 * Établir une communication
	 * @param emetteur
	 * @param numeroDestinataire
	 * @param msgVocal : message en cas d'indisponibilité
	 * @param dateAppel
	 * @return vrai si la communication a été établie
	 */

	public boolean etablirCommunication(AbonneOperateur emetteur, String numeroDestinataire, String msgVocal, Date dateAppel)
	{
		AbonneOperateur destinataire = null;
		if(chercherDestinataire(numeroDestinataire, operateurs, destinataire)){

			// emetteur.appeler(numeroDestinataire, msgVocal, dateAppel);
			String numeroAppelant = emetteur.getNumero();
			destinataire.accepterAppel(numeroAppelant);

			return true;
		}
		else{
			return false;
		}
	}

	/**
	 * Chercher le destinaire auprès de l'opérateur (savoir s'il existe ou non) pour pouvoir établir la communication
	 * @param numeroDestinataire : numéro de la personne à contacter
	 * @param listOp : liste d'operateurs 
	 * @return : vrai si le numéro a été trouvé
	 */


	public boolean  chercherDestinataire (String numeroDestinataire, List<Operateur> listOp, AbonneOperateur destinataire){

		Iterator<Operateur> it = listOp.iterator();
		Iterator<NumeroTelephone> itNumsTel;
		boolean trouve = false;

		// on parcourt tous les operateurs de la liste

		while(it.hasNext() && !trouve){

			Operateur courant = it.next();
			itNumsTel = courant.numsTel.iterator();

			// on parcourt un seul operateur pour trouver le numero dans sa liste de numero

			while(itNumsTel.hasNext() && !trouve)
			{
				NumeroTelephone numCourant = itNumsTel.next();
				trouve = numCourant.equals(numeroDestinataire); // rend vrai si le numéro courant est égal au numéro du destinataire

				if (trouve){
					destinataire = numCourant.getAbonne(); // On assigne le numéro de téléphone courant trouvé au destinataire
				}
			}
		}
		return trouve;
	}

	/**
	 * poster un SMS
	 * @param emetteur
	 * @param numeroDestinataire
	 * @param sms : le texte du SMS
	 * @pamra dateEnvoi  	// Méthode toString
	 */
	
	public void posterSMS(AbonneOperateur emetteur, String numeroDestinataire, String sms, Date dateEnvoi)
	{
		// TODO
	}

	/**
	 * un abonné met fin à une communication
	 * @param abonne : celui qui clôt
	 * @param date de fin de communication
	 */
	
	public void cloreAppel(AbonneOperateur abonne, Date fin)
	{
		// TODO
	}




} // Operateur
